/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.folha.controller;

import br.com.folha.dao.GenericoDao;
import br.com.folha.dao.PredioDao;
import br.com.folha.dao.SalaDao;
import br.com.folha.entity.Predio;
import br.com.folha.entity.Sala;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.faces.model.SelectItem;

/**
 *
 * @author marceloml
 */
@ManagedBean(name="SalaController")
@ViewScoped
public class SalaController implements Serializable{
    
    private static final long serialVersionUID = 1L;
    
    private Sala sala;
    private Sala salaSelecionada;
    private transient DataModel lista;
    private GenericoDao salaDao = new GenericoDao(); 
    private SalaDao consulta = new SalaDao();
    
    private Predio predio;
    private Integer selectedPredio;
    private PredioDao predioDao = new PredioDao();
    
    private String acao;
    private Long retorno;
    private Date data = new Date();
    private boolean resultado;
    
  public SalaController(){
      
      sala = new Sala();
      
      acao = "";
      
  }
    
  public Collection<SelectItem> getCarregarPredios() {        
      
        predio = new Predio();
        predioDao = new PredioDao();
      
        Collection<SelectItem> lst = new ArrayList<SelectItem>();        
        lst.add(new SelectItem(null, "Selecione o Prédio"));      //Primeiro item do select                  
        
        List<Predio> listaPredio = predioDao.listaPredio(predio);
        
        for (int i = 0; i < listaPredio.size(); i++) {          
            lst.add(new SelectItem(listaPredio.get(i).getId(), listaPredio.get(i).getUnidade().getNome() +" - "+ listaPredio.get(i).getNome()));
        }          
        
        return lst;          
    }    
  
    public void preparaInclusao(){  
        
        FacesMessage msg = null;   
        
        if(sala.getNome().equals("")){
            
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "É necessário informar o nome da Sala!", "");
                FacesContext.getCurrentInstance().addMessage(null, msg);
                
        }else if(selectedPredio == 0){
            
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "É necessário informar o Prédio onde fica a Sala!", "");
                FacesContext.getCurrentInstance().addMessage(null, msg);            
                
        }else{
            
            if(!acao.equals("edicao")){
                
                retorno = consulta.consultaNome(predio.getNome(), predioDao.getById(selectedPredio));
                
                if(retorno != 0){
                    
                    msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Já Existe uma sala com esse nome no prédio selecionado!", "");
                    FacesContext.getCurrentInstance().addMessage(null, msg);                     
                    
                }else{
                    
                    salvaOperacao();
                    
                }
                
            }else{
                
                editaOperacao();
                
            }            
            
        }
    }
    
    public void salvaOperacao(){
        
        FacesMessage msg = null;   
        
        //Seta a data de Cadastro
        sala.setDt_cadastro(data);
        
        LoginController usuarioLogado = new LoginController();  
        
        sala.setUsuario_cadastro(usuarioLogado.getUsuario().getId());
        
        sala.setPredio(predioDao.getById(selectedPredio));
        
        resultado = salaDao.salvar(sala);
        
        if(resultado){
        
            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Sala cadastrada com sucesso!", "");
            FacesContext.getCurrentInstance().addMessage(null, msg);                        
        
            resetSala();            
            
        }else{
            
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Falha ao cadastrar Sala!", "");
            FacesContext.getCurrentInstance().addMessage(null, msg);             
            
        }
        
    }    
    
    public void preparaEdicao(){
        
        sala = salaSelecionada;
        
        selectedPredio = salaSelecionada.getPredio().getId();
        
        acao = "edicao";
        
    }
    
    public void editaOperacao(){
        
        FacesMessage msg = null;   
        
          retorno = consulta.consultaNome(predio.getNome(), predioDao.getById(selectedPredio));
                                   
                    //Seta a data de Cadastro
                    sala.setDt_atualizacao(data);

                    LoginController usuarioLogado = new LoginController();  

                    sala.setUsuario_atualizacao(usuarioLogado.getUsuario().getId());

                    sala.setPredio(predioDao.getById(selectedPredio));

                    resultado = salaDao.atualizar(sala);

                    if(resultado){

                        msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Sala atualizada com sucesso!", "");
                        FacesContext.getCurrentInstance().addMessage(null, msg);                        

                        resetSala();      
                        
                        acao = "";

                    }else{

                        msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Falha ao atualizar Sala!", "");
                        FacesContext.getCurrentInstance().addMessage(null, msg);             

                    }                    
                    
    }   
    
    public void deletaSala(){
        
        FacesMessage msg = null;   
        
        if(salaSelecionada == null){
            
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Nenhuma Sala selecionado!", "");
            FacesContext.getCurrentInstance().addMessage(null, msg);                         
            
        }else{
            
            resultado = salaDao.excluir(salaSelecionada);
            
            if(resultado){
                
                msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Sala excluída!", "");
                FacesContext.getCurrentInstance().addMessage(null, msg);      
                
                resetSala();                                
                
            }else{
                
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Falha ao deletar Sala!", "");
                FacesContext.getCurrentInstance().addMessage(null, msg);                 
                
            }
            
        }
        
    }    
    
    public void resetSala(){
        
        sala = new Sala();
        acao = "";
        selectedPredio = 0;
        
        lista = new ListDataModel(consulta.listaSala(sala));
        
    }

    /**
     * @return the sala
     */
    public Sala getSala() {
        return sala;
    }

    /**
     * @param sala the sala to set
     */
    public void setSala(Sala sala) {
        this.sala = sala;
    }

    /**
     * @return the salaSelecionada
     */
    public Sala getSalaSelecionada() {
        return salaSelecionada;
    }

    /**
     * @param salaSelecionada the salaSelecionada to set
     */
    public void setSalaSelecionada(Sala salaSelecionada) {
        this.salaSelecionada = salaSelecionada;
    }

    /**
     * @return the lista
     */
    public DataModel getLista() {
        
        if(lista == null || lista.getRowCount() == 0){
                        
                    lista = new ListDataModel(consulta.listaSala(sala));
        
        }        
        
        return lista;
    }

    /**
     * @return the selectedPredio
     */
    public Integer getSelectedPredio() {
        return selectedPredio;
    }

    /**
     * @param selectedPredio the selectedPredio to set
     */
    public void setSelectedPredio(Integer selectedPredio) {
        this.selectedPredio = selectedPredio;
    }
    
}
